BOOT LOGO以及显示参数使用参考

version 1.3


1. 概述

本文提供了在SDK编译环境中添加、删除、修改Boot logo的方法。

更改logo前需要注意:

  1. 目前bootlogo只支持jpg图片格式,因为是软件解码,所以图片太大会导致解码速度变慢,导致出图慢。公版默认分配的bootlogo buffer为1M,图片的分辨率需要满足width*height*1.5\<1M;图片大小需要小于logo分区的大小128KB

  2. 图片的宽需要16对齐


在Uboot中已经实现了一套解码JPG、显示的驱动,使用时通过bootcm去显示BOOT LOGO。

BOOT LOGO显示步骤如下:

  1. 从固定的LOGO分区中抓取屏参或者HDMI/VGA的显示相关信息、原始的JPEG data。

  2. 显示相关信息保存了多个屏参数据,uboot会根据当前的env中的命名找到所对应的屏参数据。

  3. 原始的JPGE data也支持多个,根据用户参数可以动态切换所要显示的JPGE。

  4. 显示信息中还提供了uboot用于显示的buffer地址以及屏幕分辨率和显示刷新率。

  5. 把JPEG RAW data送进解码器解码。

  6. 有两种方法可以把解码器解出的数据用于显示,其一是解出YUV420数据用于DISP的显示,显示内容在video层,其二是解出ARGB8888格式送给GOP,显示的内容在图形层。

  7. 初始化HDMI、Panel,显示BOOT LOGO。

    图2-1


Logo支持两种分区格式:

  • LOGO分区

    围绕LOGO分区有相关的配置和分区制作的方法,详细介绍参见LOGO分区制作

  • MISC分区

    MISC分区使用的是开源的littlefs文件系统,此文件系统支持读写,比较容易跨平台移植,rtk、uboot和linux中都有支持,并且读取速度非常快,支持掉电保护以及有不错的写均衡机制,因此利用此文件系统可以替代原来的LOGO分区。屏参文件和图片jpeg文件可以做到在uboot、linux、rtk共享一套配置,相对于LOGO分区,使用MISC分区对于使用者来说更加方便对屏参进行修改。

在misc分区中,替代屏参数据的是INI脚本,在uboot中也集成了一套INI parser的代码,用于屏参数据解析,将来也可以扩展成其他功能配置的INI解析。

屏参的基本配置都在INI中,这份INI与LINUX共用,因此对于客户端,只需维护一套屏参。

下表列出LOGO分区与MISC分区的特性。

LOGO分区 MISC分区
动态支持屏参变更 支持 支持
屏参参数动态修改 不支持 支持
开机logo图片动态修改 不支持 支持
屏参数据解析时间(估算) 55ms 59ms
是否与LINUX共用屏参
支持在Linux上mount 不支持 支持
分区大小(spinand) 384KB 384KB

MISC分区的littlefs使用的Block size为32KB,因此对于nor flash,在MISC分区中不宜添加多个文件,特别是多个很小的INI配置脚本,若遇到这种情况,请考虑把所有的配置都集中写到一个ini配置脚本中。

Uboot的在开机logo阶段首先会先读取当前的MTD part中是否存在带”misc”、”logo”字段的分区,若存在misc分区,则会读取misc分区中的屏参信息进行点屏和显示logo的动作,否则则会读取LOGO分区中的相关信息。



4.1. Enable bootlogo hdmi

  • Uboot:

    打开如下config:

    CONFIG_CMD_BOOTLOGO
    CONFIG_SSTAR_DISP
    CONFIG_SSTAR_DISP_HDMITX_VGA
    CONFIG_SSTAR_HDMITX
    CONFIG_SSTAR_JPD
    

    注意:如果有用到hdmi,kernelCONFIG_ANALOG_PD_HDMI_ATOP需要关闭,不然kernel起来开机logo会消失


4.2. Enable bootlogo panel

  • Uboot:

    打开如下config:

    CONFIG_CMD_BOOTLOGO
    CONFIG_SSTAR_DISP
    CONFIG_SSTAR_PNL
    CONFIG_SSTAR_JPD
    

4.3. Enable MISC partition & INI Parser(暂不支持)

  • Uboot:

    打开如下config:

    CONFIG_FS_LITTLEFS=y
    CONFIG_SSTAR_INI_PARSER=y
    
  • Kernel:

    Build in fuse.

    图4-1



图5-1

LOGO分区分为Partition的header和若干个sub header。

Partition header中保存了sub header的计数以及Tittle。

目前Sub header有两种数据,其一种是保存了屏参以及HDMI/VGA显示参数的数据,这些数据是以C语言结构体的形式保存在Flash中,另外一种是若干个Sub header保存的是Jpeg的图片。

在显示数据中,字段 Frist_use_offset是用于索引当前默认使用的屏参或者hdmi/vpa的设定。


BOOT LOGO的基本修改是基于LOGO分区已经创建,同时显示设备(display out: panel/HDMI/VGA)已经配置完成,在此基础上可以修改LOGO分区中指定的优先使用的显示设备,用于显示的内存地址,以及开机LOGO的文件名。

  1. 打开build config文件修改三个字段:

    BOOTLOGO_FILE = sigmastar1024_600.jpg
    BOOTLOGO_ADDR = E_LX_FB
    DISP_OUT_NAME = SAT070CP50
    
  2. BOOTLOGO_FILE 表示在project\board\ini\misc\下使用对应的文件名用于logo显示。

  3. BOOTLOGO_ADDR用于显示用的内存地址。

  4. DISP_OUT_NAME 显示使用的输出name,如何制定可以参考LOGO分区制作。


LOGO的RAW data分区生成的源码路径在:

project\image\makefiletools\src\rawgenerator。

在此路径下执行make,会自动把可执行的bin copy到project\image\makefiletools\bin\用于在编译阶段生成对应的LOGO image。

LOGO分区生成的脚本:

project\image\image.mk

图5-2

LOGO的image由dispcfggen和logogen两个工具生成,dispcfggen用于产生显示相关的参数数据,logogen生成由图片组成的LOGO数据。

显示数据部分生成的代码路径:

project\image\makefiletools\src\rawgenerator\disp_data_main.c

Jpeg图片数据生成的代码路径:

project\image\makefiletools\src\rawgenerator\logo_data_main.c

使用参数说明:

dispcfggen:

-c 创建一个Raw data的header,并添加显示的sub header和数据,若-o指定的文件存在,则清空文件。

-a 在已经有Raw data header和相关数据的文件末尾追加一个显示相关的sub header以及数据。

-o 指定输出的文件。

-p 板子上用于显示的物理地址

-s 显示地址的内存大小

-d 显示输出的索引名

logogen:

-c 创建一个Raw data的header,并添加jpeg文件的sub header和数据,若-o指定的文件存在,则清空文件。

-a 在已经有Raw data header和相关数据的文件末尾追加一个jpeg文件的sub header以及数据。

-o 指定输出的文件。

-i jpeg 文件的路径。


5.4. 修改显示数据

显示数据分成两部分,一部分是屏参,用于panel显示,另外一部分是HDMI/VGA显示输出,这两种属性在使用上是互斥的,用户一旦设定了DISP_OUT_NAME为屏参的名字则输出的显示数据中都是屏参数据,否则若设定的是以HDMI/VGA开头的名字,则只会输出HDMI/VGA的参数数据,例如指定HDMI_1080P60。

5.4.1. 屏参修改

  1. 屏参文件可以向FAE获取,或者自己根据相关文档进行配置。

  2. 屏参文件是一个已经初始化好的结构体数据,存放在一个h文件中,project\image\makefiletools\src\rawgenerator\pnl中存放了公版所有用到的屏参文件,请注意,每个屏参的头文件中声明的数据结构名字和一些define不得重复,否则会编译失败。

  3. 在文件disp_data_main.c中修改或者添加stTable,分别指定屏参名字,屏参数据结构以及mipi 命令数 据结构。特别注意,对于ttl的屏没有mipi参数,因此在mipi那一栏填NULL。

    图5-3

  4. 屏参include:

    图5-4

  5. 以上修改完成后重新编译生成执行文件,用执行文件生成LOGO的image中就有添加的屏参,在屏参生成的参数中用-d指定优先使用的屏参的名字,若优先使用的屏参不是正确的屏参,在uboot还可以通过修改env来改变屏参,改动方法参考“多屏参多logo切换”。

5.4.2. HDMI/VGA设定修改

  1. HDMI、VGA的参数设定没有屏参那么复杂,只需要填写输出timing的宽高和clock。

  2. 修改方式如下:

    图5-5


5.5. 多显示参数切换

LOGO的分区中保存了所有的显示参数数据,目前可以通过env来切换不同的显示参数。

使用uboot的env ${dispout}当中显示设置的索引,默认情况下此env为空,在第一次上电起来后若在uboot阶段执行了bootlogo命令,则会把当前使用的设定对应的名字保存到${dispout}。

‘bootlogo’命令执行流程图:

图5-6

通过以上流程图可知,在未指定环境变量${dispout}的情况下,系统会默认设定优先使用的显示参数,在${dispout}与优先使用的显示参数发生不一致的情况,系统则会自动按照${dispout}设定的值去索引对应的显示参数,若找到则回写到flash中,这样下次开机的流程就按照与环境变量匹配的流程执行。


6. MISC分区制作与配置


6.1. MISC分区制作

MISC分区的文件系统是littlefs,littlefs的打包和linux端自动mount分区都已经在ALKAID的打包脚本中集成好了,如何添加一个MISC分区,请参考分区介绍,这里简单地把一些配置列出来。

根据分区文档中的介绍,若要添加一个MISC分区,需要在project\image\configs\$(chip)中修改相应的xxx.config文件。

举例:

  1. 添加分区的基本配置

    misc$(RESOUCE) = $(OUTPUTDIR)/misc
    misc$(FSTYPE)  = lfs
    misc$(PATSIZE) = 0x60000
    misc$(MOUNTPT) = /dev/mtdblock8
    misc$(MOUNTTG) = /misc
    misc$(MTDPART) = $(misc$(PATSIZE))(misc)
    misc$(OTABLK) = /dev/mtdblock8
    

    由于littlefs已经得到了ALKAID打包脚本的支持,因此在这里misc$(FSTYPE)填成lfs后就可以自动打包成lfs的image包了。

  2. 添加mount节点列表

    USR_MOUNT_BLOCKS:=miservice customer appconfigs misc
    
  3. 添加image列表

    IMAGE_LIST = cis ipl ipl_cust uboot misc kernel rootfs miservice customer appconfigs
    
  4. 添加OTA列表(如必要)

    OTA_IMAGE_LIST = ipl ipl_cust uboot misc kernel miservice customer appconfigs
    
  5. misc.mk或者rootfs.mk中添加文件拷贝命令

    mkdir -p $(OUTPUTDIR)/misc;
    mkdir -p $(OUTPUTDIR)/rootfs/misc;
    cp -rf $(PROJ_ROOT)/board/ini/misc/sigmastar1024_600.jpg $(OUTPUTDIR)/misc/;
    cp -rf $(PROJ_ROOT)/board/ini/misc/upgrade.jpg $(OUTPUTDIR)/misc/;
    cp -rf $(PROJ_ROOT)/board/ini/misc/config.ini $(OUTPUTDIR)/misc/;
    

关于屏参和logo显示相关的配置都集成在了/misc/config.ini中,ini文件可以在linux起来后在路径/misc/下手动修改,也可以重新打包一个misc分区,对分区重新烧写。对ini中相关的logo参数的修改就可以起到切换不同屏参,显示不同logo的效果,具体做法如下。

所有对LOGO显示配置的修改都集中在INI的"LOGO"的section中:

[LOGO]
m_eDeviceType = 1; #0 None, 1 LCD, 2 HDMI, 3 VGA
m_sParaTarget = ST7710S
m_wDispWidth = 0
m_wDispHeight = 0
m_wDispFps = 0
m_sLogoFile0 = sigmastar1024_600.jpg
m_sLogoFile1 = upgrade.jpg

表示需要显示LOGO的设备类型。

  • m_sParaTarget:

    显示的屏参section索引,只有LOGO设备类型为LCD时才会生效。

  • m_wDispWidth,m_wDispHeight,m_wDispFps:

    当显示设备为非LCD类型时,这些参数才有意义,表示的是HDMI/VGA输出的timming。

  • m_sLogoFile0,m_sLogoFile1

    LOGO的id所对应的jpeg文件。

INI文件修改完成后重启生效。


7. UBoot命令


在Uboot中执行bootlogo [logo index] [aspect ratio] [x] [y],此命令会带四个参数分别表示:

  1. LOGO中打包的JPEG的数字索引。

  2. 显示logo的aspect ratio,0表示zoom,全屏显示,1表示center,居中显示,2表示user,用户设定起始点,点对点显示。

  3. 若aspect ratio为user, x、y表示图片显示的起始点。


在uboot中修改env ‘logo_rot’,修改完之后重启,或者再次执行bootlogo命令。

logo_rot = 0 表示不旋转

logo_rot = 1 顺时针旋转90°

logo_rot = 2 顺时针旋转180°

logo_rot = 3 顺时针旋转 270°

LOGO旋转后画面左上角仍然从显示的(0, 0)坐标开始显示,其图片的宽和高有可能发生调换,请注意旋转后的图片都必须在显示的区域内,否则显示驱动会报错。


8. sd/usb升级UI显示

在uboot中需要打开 SSTAR UPGRADE UI,此命令依赖于SSTAR RGN 、SSTAR DISP。

图8-1

SD卡和USB升级的UI由一张背景图片和一个进度条组成。

UI背景图片依赖于bootlogo命令,boologo显示第二张图片作为升级的UI。

目前使用的图片在:

project\board\ini\misc\upgrade.jpg

图片+进度条显示效果:

图8-2


9. Linux使用屏参

Linux代码中通过读取LOGO分区的数据可以获取当前的屏参,在应用端无需再维护多个屏参的头文件,这样可以增加代码的通用性,目前从flash中获取屏参的接口还未开放出来。

若使用的是MISC分区,屏参文件和jpg图片会自动mount到/misc目录下,应用可以参考Panel文档中的介绍如何使用屏参ini文件。